重載是一種很多程式語言的特性, 只允許存在同一名稱但不同簽章的方法, 簽章指的是參數的類型與個數, 但 PHP 不支持這特性, 但可以通過 PHP 提供的魔術方法 /_/call //_callStatic 來模擬方法重載
<?php
// public __call(string $name, array $arguments): mixed
// 當調用物件裡面不可訪問的方法時會調用 __call, 並將方法名當第一個參數傳入,
// 方法的參數全部變成array 當第二個參數傳入
class Math
{
public function __call($fnName, $fnArgs)
{
if ($fnName === 'add') {
$sum = 0;
foreach($fnArgs as $arg)
{
$sum += $arg;
}
echo implode(',', $fnArgs).'總和是: '.$sum."\n";
}
}
}
$math = new Math();
$math->add(1, 2);
$math->add(1, 2, 3);
// 1,2總和是: 3
// 1,2,3總和是: 6
當整個專案愈來愈大時, 可能會遇到同類名, 同名函數, 同名常數, 從 PHP 5.3 開始提供命名空間讓我們可以將他們分別放到不同的命名空間中, 使用 namespace 關鍵字來聲明命名空間, 命名空間只能存放類, 函數, 常數, 第一個 namespace 前面不能有任何代碼, 引入檔案不影響當前的命名空間
<?php
namespace SolarSystem;
function getInfo()
{
echo "我在太陽系\n";
}
namespace Earth;
function getInfo()
{
echo "我在地球\n";
}
getInfo();
\SolarSystem\getInfo();
\Earth\getInfo();
// 結果
// 我在地球
// 我在太陽系
// 我在地球
trait 是 PHP 5.4 開始提供的特性, 減少單繼承語言的限制, 可以在不同層次結構內獨立出覆用的代碼, 多個 trait 可以組成一個 trait, trait 可以定義抽象成員, 可以定義靜態成員
<?php
trait A
{
public function readPoem()
{
echo "會讀唐詩三白首\n";
}
}
class Student
{
use A; // 代碼覆用
}
class Coder
{
use A;
}
$student1 = new Student;
$student1->readPoem();